<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Web高级开发 | Advanced Web Development Course</title>
    <link
      href="https://fonts.googleapis.com/css?family=Heebo:300,400"
      rel="stylesheet"
    />
    <link rel="stylesheet" href="../../css/main.css" />
    <link rel="stylesheet" href="../../css/tabs.css" />
    <script src="../../js/uikit.js"></script>
    <link href="../../css/prism.css" rel="stylesheet" />
    <script src="../../js/prism.js"></script>
  </head>

  <body>
    <div
      data-uk-sticky="animation: uk-animation-slide-top; sel-target: .uk-navbar-container; cls-active: uk-navbar-sticky; cls-inactive: uk-navbar-transparent; top: 300"
    >
      <nav class="uk-navbar-container pt-2 pb-2">
        <div class="uk-container">
          <div data-uk-navbar>
            <div class="uk-navbar-left">
              <a
                class="uk-navbar-item uk-logo uk-visible@m"
                href="../../index.html"
                >Web高级开发课程</a
              >
              <a
                class="uk-navbar-tuk-containeroggle uk-hidden@m"
                href="#offcanvas-docs"
                data-uk-toggle
                ><span data-uk-navbar-toggle-icon></span>
                <span class="uk-margin-small-left">目录</span></a
              >
              <ul class="uk-navbar-nav uk-visible@m">
                <li><a href="../../index.html">文档</a></li>
              </ul>
            </div>
            <div class="uk-navbar-center uk-hidden@m">
              <a class="uk-navbar-item uk-logo" href="../../index.html"
                >Web高级开发课程</a
              >
            </div>
          </div>
        </div>
      </nav>
    </div>

    <div class="uk-section">
      <div class="uk-container">
        <div class="uk-grid-large" data-uk-grid>
          <div class="sidebar-fixed-width uk-visible@m">
            <div class="sidebar-docs uk-position-fixed uk-margin-top">
              <h5>关于这门课</h5>
              <ul class="uk-nav uk-nav-default doc-nav">
                <li><a href="../../index.html">大纲</a></li>
              </ul>
              <h5>章节</h5>
              <ul class="uk-nav uk-nav-default doc-nav">
                <li><a href="../01.html">第1章 - Spring基础</a></li>
                <li><a href="../02.html">第2章 - Spring中的Bean</a></li>
                <li><a href="../03.html">第3章 - Spring AOP</a></li>
                <li><a href="../04.html">第4章 - Spring的事物管理</a></li>
                <li><a href="../05.html">第5章 - 初识MyBatis</a></li>
                <li><a href="../06.html">第6章 - MyBatis的核心配置</a></li>
                <li><a href="../07.html">第7章 - MyBatis的高级应用</a></li>
                <li><a href="../08.html">第8章 - Spring MVC入门</a></li>
                <li><a href="../09.html">第9章 - Spring MVC数据绑定</a></li>
                <li><a href="../10.html">第10章 - Spring MVC拦截器</a></li>
                <li><a href="../11.html">第11章 - Spring Boot基础</a></li>
                <li><a href="../12.html">第12章 - Spring Boot的Web开发</a></li>
                <li>
                  <a href="../13.html">第13章 - Spring Boot的数据库连接</a>
                </li>
                <li><a href="../14.html">第14章 - 框架整合</a></li>
              </ul>
              <h5>实验课</h5>
              <ul class="uk-nav uk-nav-default doc-nav">
                <li><a href="./code-01.html">01</a></li>
                <li><a href="./code-02.html">02</a></li>
                <li><a href="./code-03.html">03</a></li>
                <li class="uk-active"><a href="./code-04.html">04</a></li>
                <li><a href="./code-05.html">05</a></li>
                <li><a href="./code-06.html">06</a></li>
                <li><a href="./code-07.html">07</a></li>
                <li><a href="./code-08.html">08</a></li>
                <li><a href="./code-09.html">09</a></li>
                <li><a href="./code-10.html">10</a></li>
                <li><a href="./code-11.html">11</a></li>
                <li><a href="./code-12.html">12</a></li>
              </ul>
            </div>
          </div>
          <div class="uk-width-1-1 uk-width-expand@m">
            <article class="uk-article">
              <h3>实验课04 - MyBatis快速入门</h3>
              <div>
                <p>
                  0. 复制下面的代码到SQL的IED(比如workbench)中
                  <br>
                  下面代码要做的是创建一个名为db_mybatis的数据库
                  <br>
                  在这个数据库中创建一个t_user表
                  <br>
                  同时添加几条数据
                </p>
                <pre class="line-numbers">
<code class="language-sql">CREATE database db_mybatis;
USE db_mybatis;
create table t_user(
      id int(32) PRIMARY KEY AUTO_INCREMENT,
      username varchar(50),
      job varchar(50),
      phone varchar(16));

INSERT into t_user VALUES(1, 'zhangsan', 'tester', 12121212);
INSERT into t_user VALUES(2, 'lisi', 'worker', 123123123);
INSERT into t_user VALUES(3, 'wangwu', 'developer', 12341234);</code></pre>



                <p>
                  1. 在pom.xml文件的dependencies里添加下面的依赖
                  <br>
                  然后右键当前项目 --> Maven --> update project，让maven导入相应的jar包
                </p>
                <pre class="line-numbers">
<code class="language-markup">&lt;dependency&gt;
  &lt;groupId&gt;org.mybatis&lt;/groupId&gt;
  &lt;artifactId&gt;mybatis&lt;/artifactId&gt;
  &lt;version&gt;3.5.5&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
  &lt;groupId&gt;log4j&lt;/groupId&gt;
  &lt;artifactId&gt;log4j&lt;/artifactId&gt;
  &lt;version&gt;1.2.17&lt;/version&gt;
&lt;/dependency&gt;
  &lt;dependency&gt;
  &lt;groupId&gt;mysql&lt;/groupId&gt;
  &lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt;
&lt;/dependency&gt;</code></pre>


<p>
2. 由于MyBatis默认使用log4j输出日志信息，所以如果要查看控制台的输出SQL语句，就需要配置日志文件。
<br>
在项目的src/main/resources目录下创建log4j.properties文件，内容如下：
</p>
<pre class="line-numbers">
<code class="language-markup"># gloable logging configuration
log4j.rootLogger=ERROR, stdout
# mybatis logging configuration
log4j.logger.com.ssm=DEBUG
Console output
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] -%m%n</code></pre>


<p>
3. 创建User类
<br>
</p>
<pre class="line-numbers">
<code class="language-java">public class User {
  private Integer id;
  private String username;
  private String job;
  private String phone;

  public Integer getId() {
    return id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }

  public String getJob() {
    return job;
  }

  public void setJob(String job) {
    this.job = job;
  }

  public String getPhone() {
    return phone;
  }

  public void setPhone(String phone) {
    this.phone = phone;
  }

  @Override
  public String toString() {
    return "User [id=" + id + ", username=" + username + ", job=" + job + ", phone=" + phone + "]";
  }
}
</code></pre>


<p>
4. 在src目录下创建一个包(包名随便叫，可以是com.qust.mapper),在里面创建映射文件UserMapper.xml
<br>
内容如下
</p>
<pre class="line-numbers">
<code class="language-xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!-- mybatis的配置约束 --&gt;
&lt;!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"&gt;
&lt;mapper namespace="com.qust.mapper.UserMapper"&gt;
  &lt;!-- parameterType: 传入参数类型 --&gt;
  &lt;!-- resultType: 返回的数据类型 --&gt;
  &lt;!-- #{id}: 接受的参数是id --&gt;
  &lt;select id="findUserById" parameterType="Integer" resultType="com.qust.mybatisproject.User"&gt;
    SELECT * FROM t_user where id=#{id}
  &lt;/select&gt;
&lt;/mapper&gt;
</code></pre>

<p>
5. 在src/main/resources包内创建mybatis-config.xml配置文件，主要用于做与数据库的连接配置。
<br>
代码里面内容如下
</p>
<pre class="line-numbers">
<code class="language-xml">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
&lt;!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd"&gt;
&lt;configuration&gt;
  &lt;!-- 配置环境，默认的环境id为mysql --&gt;
  &lt;environments default="mysql"&gt;
      &lt;!-- 配置环境,id:环境的唯一标识 --&gt;
      &lt;environment id="mysql"&gt;
          &lt;!-- 事务管理器，type:使用jdbc的事务管理器 --&gt;
          &lt;transactionManager type="JDBC" /&gt;
          &lt;!-- 数据源，type:池类型的数据源 --&gt;
          &lt;dataSource type="POOLED"&gt;
              &lt;!-- 配置连接信息 --&gt;
              &lt;property name="driver" value="com.mysql.cj.jdbc.Driver" /&gt;
              &lt;property name="url" value="jdbc:mysql://localhost:3306/db_mybatis?serverTimezone=UTC" /&gt;
              &lt;property name="username" value="root" /&gt;
              &lt;property name="password" value="root" /&gt;
          &lt;/dataSource&gt;
      &lt;/environment&gt;
  &lt;/environments&gt;
  &lt;mappers&gt;
    	&lt;!-- 文件路径引入 相对位置--&gt;
        &lt;mapper resource="com/qust/mapper/UserMapper.xml" /&gt;
        &lt;!-- 其他引入方式：https://blog.csdn.net/Oktfolio/article/details/78958560 --&gt;
    &lt;/mappers&gt;
&lt;/configuration&gt;
</code></pre>

<p>
6. 在main方法中写入下面的代码然后跑一波
</p>
<pre class="line-numbers">
<code class="language-java">@SpringBootApplication
public class Main {

  public static void main(String[] args) throws IOException {
    // 1. 读取配置文件
    InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

    // 2. 根据配置文件构建SqlSessionFactory实例
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

    // 3.通过SqlSessionFactory创建SqlSession实例
    SqlSession sqlSession = sqlSessionFactory.openSession();

    //4.SqlSession执行映射文件中定义的SQL, 并返回映射结果 
    int userId = 1; 
    User user = sqlSession.selectOne("com.qust.mapper.UserMapper.findUserById", userId);

    //5.打印 
    System.out.println(user.toString());

    //6.关闭
    sqlSession sqlSession.close();
  }

}

</code></pre>
<p>
7. 根据用户名模糊查询用户信息
<br>
在UserMapper.xml中添加根据用户名模糊查询用户信息的SQL语句，代码如下
</p>
<pre class="line-numbers">
<code class="language-xml">&lt;select id="findUserByName" parameterType="String" resultType="com.qust.mybatisproject.User"&gt;
  SELECT * FROM t_user where username like '%${value}%'
&lt;/select&gt;
</code></pre>

<p>
再在main方法中添加如下代码来调用模糊查询方法：
<br>
(搜出名字里带"g"的兄弟)
</p>
<pre class="line-numbers">
<code class="language-java">List<User> users = sqlSession.selectList("com.qust.mapper.UserMapper.findUserByName", "g");

for(User user : users) { 
  System.out.println(user.toString()); 
}

sqlSession.close();
</code></pre>
<p>
注意：
<br>
1）#{} 为参数占位符 "?"，即sql 预编译
<br>
2）${} 为字符串替换，即 sql 拼接
<br><br>
假设传入参数为 1
<br>
#{}的变化过程为：<br>
1) #{}：select * from t_user where uid=#{uid}<br>
2) #{}：select * from t_user where uid= ?<br>
3) #{}：select * from t_user where uid= '1'
<br><br>
${}的变化过程为：<br>
1) select * from t_user where uid= '${uid}'<br>
2) ${}：select * from t_user where uid= '1'<br>
</p>

<p>
8. 添加用户
<br>
在UserMapper.xml中添加增加用户的SQL语句，代码如下
<br>
注意：这里的"mybatisproject"是你的项目的名称。比如，如果是mybatis-demo，这里就要改成"mybatisdemo"。
</p>
<pre class="line-numbers">
<code class="language-xml">&lt;insert id="addUser" parameterType="com.qust.mybatisproject.User"&gt;
  INSERT INTO t_user(username, job, phone) values (#{username}, #{job}, #{phone})
&lt;/insert&gt;</code></pre>
<p>
注释掉上一步的代码，再在main方法中添加如下代码来调用增加用户的方法：
<br>
</p>
<pre class="line-numbers"><code class="language-java">User user = new User();
user.setUsername("Tom");
user.setJob("Worker2");
user.setPhone("10086");

int rows = sqlSession.insert("com.qust.mapper.UserMapper.addUser", user);
if (rows > 0) {
  System.out.println("成功添加" + rows + "条数据");
}
else {
  System.out.println("添加数据失败");
}

sqlSession.commit();
sqlSession.close();
</code></pre>
<p>运行后数据库的t_user里会多出Tom的记录</p>

<p>
9. 更新用户
<br>
在UserMapper.xml中添加更新用户的SQL语句，代码如下
</p>
<pre class="line-numbers"><code class="language-xml">&lt;update id="updateUser" parameterType="com.qust.mybatisproject.User"&gt;
  UPDATE t_user set username=#{username}, job=#{job}, phone=#{phone} where id=#{id}
&lt;/update&gt;
</code></pre>
<p>
注释掉上一步的代码，再在main方法中添加如下代码来调用更新用户的方法：
<br>
</p>
<pre class="line-numbers"><code class="language-java">User user = new User();
user.setId(4);
user.setUsername("Tom");
user.setJob("cat");
user.setPhone("10010");

int rows = sqlSession.update("com.qust.mapper.UserMapper.updateUser", user);
if (rows > 0) {
  System.out.println("成功更新" + rows + "条数据");
}
else {
  System.out.println("更新数据失败");
}

sqlSession.commit();
sqlSession.close();
</code></pre>
<p>运行后Tom的信息会被更新</p>


<p>
10. 删除用户
<br>
在UserMapper.xml中添加删除用户的SQL语句，代码如下
</p>
<pre class="line-numbers"><code class="language-xml">&lt;delete id="deleteUser" parameterType="Integer"&gt;
  delete from t_user where id=#{id}
&lt;/delete&gt;
</code></pre>
<p>
注释掉上一步的代码，再在main方法中添加如下代码来调用删除用户的方法：
<br>
</p>
<pre class="line-numbers"><code class="language-java">int rows = sqlSession.delete("com.qust.mapper.UserMapper.deleteUser", 4);
if (rows > 0) {
  System.out.println("成功删除" + rows + "条数据");
}
else {
  System.out.println("更新数据失败");
}

sqlSession.commit();
sqlSession.close();
</code></pre>
<p>运行后Tom的信息会被删除</p>


              </div>
            </article>
          </div>
        </div>
      </div>
    </div>

    <div id="offcanvas-docs" data-uk-offcanvas="overlay: true">
      <div class="uk-offcanvas-bar">
        <button class="uk-offcanvas-close" type="button" data-uk-close></button>
        <h5 class="uk-margin-top">关于这门课</h5>
        <ul class="uk-nav uk-nav-default doc-nav">
          <li><a href="../indext.html">大纲</a></li>
        </ul>
        <h5 class="uk-margin-top">章节</h5>
        <ul class="uk-nav uk-nav-default doc-nav">
          <li><a href="../01.html">第1章 - Spring基础</a></li>
          <li><a href="../02.html">第2章 - Spring中的Bean</a></li>
          <li><a href="../03.html">第3章 - Spring AOP</a></li>
          <li><a href="../04.html">第4章 - Spring的事物管理</a></li>
          <li><a href="../05.html">第5章 - 初识MyBatis</a></li>
          <li><a href="../06.html">第6章 - MyBatis的核心配置</a></li>
          <li><a href="../07.html">第7章 - MyBatis的高级应用</a></li>
          <li><a href="../08.html">第8章 - Spring MVC入门</a></li>
          <li><a href="../09.html">第9章 - Spring MVC数据绑定</a></li>
          <li><a href="../10.html">第10章 - Spring MVC拦截器</a></li>
          <li><a href="../11.html">第11章 - Spring Boot基础</a></li>
          <li><a href="../12.html">第12章 - Spring Boot的Web开发</a></li>
          <li><a href="../13.html">第13章 - Spring Boot的数据库连接</a></li>
          <li><a href="../14.html">第14章 - 框架整合</a></li>
        </ul>
        <h5>实验课</h5>
        <ul class="uk-nav uk-nav-default doc-nav">
          <li><a href="./code-01.html">01</a></li>
          <li><a href="./code-02.html">02</a></li>
          <li><a href="./code-03.html">03</a></li>
          <li class="uk-active"><a href="./code-04.html">04</a></li>
          <li><a href="./code-05.html">05</a></li>
          <li><a href="./code-06.html">06</a></li>
          <li><a href="./code-07.html">07</a></li>
          <li><a href="./code-08.html">08</a></li>
          <li><a href="./code-09.html">09</a></li>
          <li><a href="./code-10.html">10</a></li>
          <li><a href="./code-11.html">11</a></li>
          <li><a href="./code-12.html">12</a></li>
        </ul>
      </div>
    </div>

    <footer class="uk-section uk-text-center uk-text-muted">
      <div class="uk-container uk-container-small">
        <div class="uk-margin-medium"></div>
      </div>
    </footer>

    <script src="../js/awesomplete.js"></script>
    <script src="../js/custom.js"></script>
  </body>
</html>
